package util

import "sync"

type Dict struct {
	sync.RWMutex
	container map[string]interface{}
}

// NewConcurrentMap 创建并返回一个新的 ConcurrentMap 实例。
// @return *ConcurrentMap: 新创建的 ConcurrentMap 指针
func NewDict() *Dict {
	return &Dict{
		container: make(map[string]interface{}),
	}
}


// Get 根据 key 获取存储在 map 中的值。
// @param key: 要获取值的键
// @return interface{}: 存储的值，如果键不存在则返回 nil
// @return bool: 如果键存在则返回 true，否则返回 false
func (dict *Dict) Get(key string) interface{} {
	dict.RLock()
	defer dict.RUnlock()
	return dict.container[key]
}

// Put 将键值对存储到 map 中。如果键已存在，则覆盖旧值。
// @param key: 要存储的键
// @param value: 要存储的值
func (dict *Dict) Put(key string, value interface{}) {
	dict.Lock()
	defer dict.Unlock()
	dict.container[key] = value
}

// Clear 清空 map 中的所有键值对。
func (dict *Dict) Clear() {
	dict.Lock()
	defer dict.Unlock()
	dict.container = map[string]interface{}{}
}

// Items 返回 map 中所有的键值对副本。
// 注意：返回的是当前状态的快照，不保证后续操作的一致性。
// @return map[string]interface{}: 包含所有键值对的新 map
func (dict *Dict) Items() map[string]interface{} {
	dict.RLock()
	defer dict.RUnlock()
	// 创建一个新 map 来存储副本，避免外部修改影响内部状态
	itemsCopy := make(map[string]interface{}, len(dict.container))
	for key, value := range dict.container {
		itemsCopy[key] = value
	}
	return itemsCopy
}

// Delete 根据 key 删除 map 中的键值对。
// @param key: 要删除的键
func (dict *Dict) Delete(key string) {
	dict.Lock()
	defer dict.Unlock()
	delete(dict.container, key)
}

// Size 返回 map 中键值对的数量。
// @return int: map 的大小
func (dict *Dict) Size() int {
	dict.RLock()
	defer dict.RUnlock()
	return len(dict.container)
}